package cn.itcast.spark.rdd

import org.junit.Test

class Closure {

  /**
   * 编写一个高阶函数，在这个函数内要有一个变量，返回一个函数，通过这个变量完成一个计算
   */
  @Test
  def test(): Unit = {
    val f: Int => Double = closure()
    val area = f(5)
    println(area)

    // 在拿到f的时候，可以通过f间接的访问到closure作用域中的内容
    // 说明f携带了一个作用域
    // 如果一个函数携带了一个外包的作用域，这种函数我们称之为闭包

    // f就是闭包，闭包的本质就是一个函数
    // 在scala中函数是一种特殊的类型，FunctionX
    // 闭包也是一个FunctionX类型的对象
    // 闭包是一个对象

  }

  /**
   * 返回一个新的函数
   */
  def closure(): Int => Double = {
    val factor = 3.14
    val areaFunction = (r: Int) => math.pow(r, 2) * factor
    areaFunction
  }

}
